¿Qué config.action_cable.url debe configurarse para websockets/Rails/Kubernetes/Minukube con Nginx?
Cuando se ejecuta "docker-compose" localmente, un proceso Nginx frente a un proceso Rails (no solo API, sino con SSR) y un proceso de Cable independiente (consulte las guías ), los websockets funcionan bien al pasar el siguiente lado del servidor (en diga "/config/application.rb", con action_cable_meta_tag establecido en los diseños):
config.action_cable.url = 'ws://localhost:28080'Estoy apuntando a Kubernetes con Minikube localmente: implementé Nginx frente a una implementación de Rails (RAILS_ENV=producción) junto con una implementación de Cable, pero no puedo hacer que funcione. El servicio de Cable es interno de tipo "ClusterIP", con "port" y "targetPort". Probé varias variaciones.
¿Algún consejo?
Tenga en cuenta que uso Nginx -> Rails + Cable en Minikube, y el punto de entrada es el servicio Nginx, externo del tipo LoadBalancer donde usé:
upstream rails { server rails-svc:3000; } server { listen 9000 default_server; root /usr/share/nginx/html; try_files $uri @rails; add_header Cache-Control public; add_header Last-Modified ""; add_header Etag ""; location @rails { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header Host $http_host; proxy_pass_header Set-Cookie; proxy_redirect off; proxy_pass http://rails; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }Para permitir cualquier origen, también configuro:
config.action_cable.disable_request_forgery_protection = trueTengo una respuesta: en un clúster de Minikube, no coloque nada y deshabilite la protección contra falsificación, Rails establecerá el valor correcto por defecto. Cuando Nginx está frente a un pod de Rails y un pod de ActionCable/websocket independiente (la imagen de Rails se inicia con el bundle exec puma -p 28080 cable/config.ru ), si nombro "cable-svc" el servicio que expone el contenedor de ActionCable , y "rails-svc" el del contenedor Rails, debe:
CABLE_URI127.0.0.1:some_port ), haga lo siguiente: # config.action_cable.url <-- comment this config.action_cable.disable_request_forgery_protection=true upstream rails { server rails-svc:3000; } server { [...root, location @rails {...}] location /cable { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_pass "http://cable-svc:28080"; } }Verifique los registros, no más WebSockets en Rails y Cable responde.